package model.persistencia;

import java.sql.*;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import model.FornecedorModel;
import model.IFornecedor;
import model.IModel;

public class FornecedorDAO implements IGenericDAO {      
    
    private Statement stmt;
    private Connection con;
    private PreparedStatement ps;
    private BancoDeDados conexaoBanco;    
    private ResultSet resultado;
    private FornecedorModel fornecedor;

    public FornecedorDAO(FornecedorModel fornecedor) {
        conexaoBanco = new BancoDeDados();    
        this.fornecedor = fornecedor;        
    }
    
    @Override
    public void inserir() {       
        con = null;
        ps = null;            
        con = conexaoBanco.getConexao();              
        String sql = "INSERT INTO fornecedor(fornecedor_pk, nome, endereco, email, bairro, cidade, cep, uf, fone, "
                    + "celular, cpf, obs, rg, orgaorg, data_cadastro, cnpj, fax, contato, auditoria) "
                    + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";
        try {
            ps = con.prepareStatement(sql);            
            ps.setInt(1, fornecedor.getCodigo());
            ps.setString(2, fornecedor.getNome());
            ps.setString(3, fornecedor.getEndereco());
            ps.setString(4, fornecedor.getEmail());
            ps.setString(5, fornecedor.getBairro());
            ps.setString(6, fornecedor.getCidade());
            ps.setString(7, fornecedor.getCep());
            ps.setString(8, fornecedor.getUf());
            ps.setString(9, fornecedor.getFone());
            ps.setString(10, fornecedor.getCelular());
            ps.setString(11, fornecedor.getCpf());
            ps.setString(12, fornecedor.getObs());
            ps.setString(13, fornecedor.getRg());
            ps.setString(14, fornecedor.getOrgaorg());            
            ps.setDate(15, fornecedor.getDataCadatro());
            ps.setString(16, fornecedor.getCnpj());
            ps.setString(17, fornecedor.getFax());
            ps.setString(18, fornecedor.getContato());
            ps.setString(19, fornecedor.getAuditoria());                                    
            ps.execute();            
        } catch (SQLException ex) {
            Logger.getLogger(FornecedorDAO.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog(null, "Erro no no banco no cadastro de Fornecedor:\n"+
                        ex.getMessage()+"\n","Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
        }finally{
            try {
                ps.close();
                con.close();                
                stmt.close();
            } catch (SQLException ex) {
                Logger.getLogger(FornecedorDAO.class.getName()).log(Level.SEVERE, null, ex);
                JOptionPane.showMessageDialog(null, "Erro ao encerrar conexão:\n"+
                        ex.getMessage()+"\n","Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
            }            
        }
    }

    @Override
    public void excluir() {
        con = null;
        ps = null;
        con = conexaoBanco.getConexao(); 
        String sql = "DELETE FROM fornecedor WHERE fornecedor_pk = "+fornecedor.getCodigo()+";";  
        try {
            ps = con.prepareStatement(sql);
            ps.execute();
        } catch (SQLException ex) {
            Logger.getLogger(FornecedorDAO.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog(null, "Erro no no banco no Exclusão de Fornecedor:\n"+
                        ex.getMessage()+"\n","Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
        }finally{
            try {
                con.close();
                ps.close();
            } catch (SQLException ex) {
                Logger.getLogger(FornecedorDAO.class.getName()).log(Level.SEVERE, null, ex);
                JOptionPane.showMessageDialog(null, "Erro ao encerrar conexão:\n"+
                        ex.getMessage()+"\n","Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
            }           
        }
    }

    @Override
    public void atualizar() {        
        con = null;
        ps = null;       
        con = conexaoBanco.getConexao();         
        String sql = "UPDATE fornecedor SET nome=?, endereco=?, email=?, "
                + "bairro=?, cidade=?, cep=?, uf=?, fone=?, celular=?, cpf=?, obs=?, rg=?, "
                + "orgaorg=?, cnpj=?, fax=?, contato=?, auditoria=? "
                + "WHERE fornecedor_pk=?;";        
        try{
            ps = con.prepareStatement(sql);                        
            ps.setString(1, fornecedor.getNome());            
            ps.setString(2, fornecedor.getEndereco());
            ps.setString(3, fornecedor.getEmail());
            ps.setString(4, fornecedor.getBairro());
            ps.setString(5, fornecedor.getCidade());
            ps.setString(6, fornecedor.getCep());
            ps.setString(7, fornecedor.getUf());
            ps.setString(8, fornecedor.getFone());
            ps.setString(9, fornecedor.getCelular());
            ps.setString(10, fornecedor.getCpf());
            ps.setString(11, fornecedor.getObs());
            ps.setString(12, fornecedor.getRg());
            ps.setString(13, fornecedor.getOrgaorg());           
            ps.setString(14, fornecedor.getCnpj());
            ps.setString(15, fornecedor.getFax());
            ps.setString(16, fornecedor.getContato());
            ps.setString(17, fornecedor.getAuditoria());
            ps.setInt(18, fornecedor.getCodigo());            
            ps.executeUpdate();            
        }catch(SQLException ex) {
            Logger.getLogger(FornecedorDAO.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog(null, "Erro ao execultar a Atualização de Fornecedor:\n"+
                    ex.getMessage()+"\n","Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
        }finally{
            try {
                ps.close();
                con.close();                
            } catch (SQLException ex) {
                Logger.getLogger(FornecedorDAO.class.getName()).log(Level.SEVERE, null, ex);
                JOptionPane.showMessageDialog(null, "Erro ao encerrar conexão:\n"+
                        ex.getMessage()+"\n","Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
            }            
        }
    }   

    @Override
    public ArrayList pesquisar(int iOpcao, String iPesquisa) {
        ArrayList listaFornecedores = new ArrayList();        
        resultado = null;
        con = null;        
        stmt = null;                           
        con = conexaoBanco.getConexao();          
        try{        
            stmt = (Statement) con.createStatement();            
            resultado = stmt.executeQuery(getSQL(iOpcao, iPesquisa));                
            while(resultado.next()) {
                FornecedorModel fornecedorTemp = new FornecedorModel();            
                fornecedorTemp.setCodigo(resultado.getInt("fornecedor_pk"));                
                fornecedorTemp.setNome(resultado.getString("nome"));                
                fornecedorTemp.setEndereco(resultado.getString("endereco"));
                fornecedorTemp.setEmail(resultado.getString("email"));
                fornecedorTemp.setBairro(resultado.getString("bairro"));
                fornecedorTemp.setCidade(resultado.getString("cidade"));
                fornecedorTemp.setCep(resultado.getString("cep"));                
                fornecedorTemp.setUf(resultado.getString("uf"));
                fornecedorTemp.setFone(resultado.getString("fone"));
                fornecedorTemp.setCelular(resultado.getString("celular"));
                fornecedorTemp.setCpf(resultado.getString("cpf"));
                fornecedorTemp.setObs(resultado.getString("obs"));
                fornecedorTemp.setRg(resultado.getString("rg"));
                fornecedorTemp.setOrgaorg(resultado.getString("orgaorg"));
                fornecedorTemp.setDataCadatro(resultado.getDate("data_cadastro")); 
                fornecedorTemp.setCnpj(resultado.getString("cnpj")); 
                fornecedorTemp.setFax(resultado.getString("fax")); 
                fornecedorTemp.setContato(resultado.getString("contato"));
                fornecedorTemp.setAuditoria(resultado.getString("auditoria"));                                
                listaFornecedores.add(fornecedorTemp);
            }
        } catch (SQLException ex) {
            Logger.getLogger(FornecedorDAO.class.getName()).log(Level.SEVERE, null, ex);            
            JOptionPane.showMessageDialog(null, "Erro na Pesquisa de Fornecedores.\n"+
                    ex.getMessage(),"Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
        }finally{
            try {
                con.close();
                stmt.close();
                resultado.close();
            } catch (SQLException ex) {
                Logger.getLogger(FornecedorDAO.class.getName()).log(Level.SEVERE, null, ex);
                JOptionPane.showMessageDialog(null, "Erro ao encerrar conexão:\n"+
                        ex.getMessage()+"\n","Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
            }
        }               
        return listaFornecedores;
    }

    @Override
    public String getSQL(int iOpcao, String iPesquisa) {
        String sql = null;        
        switch (iOpcao){
            case IFornecedor.SQL_PRIMEIRO: sql = "SELECT MIN(fornecedor.fornecedor_pk) as fornecedor_pk FROM public.fornecedor;";break;
            case IFornecedor.SQL_ANTERIOR: sql = "SELECT MAX(fornecedor.fornecedor_pk) as fornecedor_pk FROM public.fornecedor "
                    + "WHERE fornecedor.fornecedor_pk < "+ iPesquisa +";";break;
            case IFornecedor.SQL_PROXIMO: sql = "SELECT MIN(fornecedor.fornecedor_pk) as fornecedor_pk FROM public.fornecedor "
                    + "WHERE fornecedor.fornecedor_pk > "+ iPesquisa +";";break;
            case IFornecedor.SQL_ULTIMO: sql = "SELECT MAX(fornecedor.fornecedor_pk) as fornecedor_pk FROM public.fornecedor;";break;
            case IFornecedor.SQL_CODIGO: sql = "SELECT fornecedor.fornecedor_pk, fornecedor.nome, fornecedor.endereco, fornecedor.email, "
                    + "fornecedor.cidade, fornecedor.bairro, fornecedor.cep, fornecedor.uf, fornecedor.celular, "
                    + "fornecedor.fone, fornecedor.cpf, fornecedor.obs, fornecedor.rg, fornecedor.orgaorg, "
                    + "fornecedor.data_cadastro, fornecedor.cnpj, fornecedor.contato, fornecedor.fax, fornecedor.auditoria "
                    + "FROM public.fornecedor WHERE fornecedor.fornecedor_pk = "+ iPesquisa +";";break;
            case IFornecedor.SQL_NOME: sql = "SELECT fornecedor.fornecedor_pk, fornecedor.nome, fornecedor.endereco, fornecedor.email, "
                    + "fornecedor.cidade, fornecedor.bairro, fornecedor.cep, fornecedor.uf, fornecedor.celular, "
                    + "fornecedor.fone, fornecedor.cpf, fornecedor.obs, fornecedor.rg, fornecedor.orgaorg, "
                    + "fornecedor.data_cadastro, fornecedor.cnpj, fornecedor.contato, fornecedor.fax, fornecedor.auditoria "
                    + "FROM public.fornecedor WHERE fornecedor.nome like '%"+ iPesquisa +"%' ORDER BY fornecedor.nome LIMIT (50);";break;
            case IFornecedor.SQL_CPF: sql = "SELECT fornecedor.fornecedor_pk, fornecedor.nome, fornecedor.endereco, fornecedor.email, "
                    + "fornecedor.cidade, fornecedor.bairro, fornecedor.cep, fornecedor.uf, fornecedor.celular, "
                    + "fornecedor.fone, fornecedor.cpf, fornecedor.obs, fornecedor.rg, fornecedor.orgaorg, "
                    + "fornecedor.data_cadastro, fornecedor.cnpj, fornecedor.contato, fornecedor.fax, fornecedor.auditoria "
                    + "FROM public.fornecedor WHERE fornecedor.cpf = '"+ iPesquisa +"';";break;    
            case IFornecedor.SQL_DATA_CADASTRO: sql = "SELECT fornecedor.fornecedor_pk, fornecedor.nome, fornecedor.endereco, fornecedor.email, "
                    + "fornecedor.cidade, fornecedor.bairro, fornecedor.cep, fornecedor.uf, fornecedor.celular, "
                    + "fornecedor.fone, fornecedor.cpf, fornecedor.obs, fornecedor.rg, fornecedor.orgaorg, "
                    + "fornecedor.data_cadastro, fornecedor.cnpj, fornecedor.contato, fornecedor.fax, fornecedor.auditoria "
                    + "FROM public.fornecedor WHERE fornecedor.data_cadastro = '"+ iPesquisa +"';";break;                   
            case IFornecedor.SQL_CIDADE: sql = "SELECT fornecedor.fornecedor_pk, fornecedor.nome, fornecedor.endereco, fornecedor.email, "
                    + "fornecedor.cidade, fornecedor.bairro, fornecedor.cep, fornecedor.uf, fornecedor.celular, "
                    + "fornecedor.fone, fornecedor.cpf, fornecedor.obs, fornecedor.rg, fornecedor.orgaorg, "
                    + "fornecedor.data_cadastro, fornecedor.cnpj, fornecedor.contato, fornecedor.fax, fornecedor.auditoria "
                    + "FROM public.fornecedor WHERE fornecedor.cidade = '"+ iPesquisa +"' ORDER BY fornecedor.cidade LIMIT (50);";break;            
            case IFornecedor.SQL_CNPJ: sql = "SELECT fornecedor.fornecedor_pk, fornecedor.nome, fornecedor.endereco, fornecedor.email, "
                    + "fornecedor.cidade, fornecedor.bairro, fornecedor.cep, fornecedor.uf, fornecedor.celular, "
                    + "fornecedor.fone, fornecedor.cpf, fornecedor.obs, fornecedor.rg, fornecedor.orgaorg, "
                    + "fornecedor.data_cadastro, fornecedor.cnpj, fornecedor.contato, fornecedor.fax, fornecedor.auditoria "
                    + "FROM public.fornecedor WHERE fornecedor.cnpj = '"+ iPesquisa +"';";break;    
            case IFornecedor.SQL_GETALL: sql = "SELECT fornecedor.fornecedor_pk, fornecedor.nome, fornecedor.endereco, fornecedor.email, "
                    + "fornecedor.cidade, fornecedor.bairro, fornecedor.cep, fornecedor.uf, fornecedor.celular, "
                    + "fornecedor.fone, fornecedor.cpf, fornecedor.obs, fornecedor.rg, fornecedor.orgaorg, "
                    + "fornecedor.data_cadastro, fornecedor.cnpj, fornecedor.contato, fornecedor.fax, fornecedor.auditoria "
                    + "FROM public.fornecedor;";break;    
        }        
        return sql;
    }

    @Override
    public int getCodigo(int iOpcao, int iCodigoAtual) {
        stmt = null;
        resultado = null;
        con = null;        
        con = conexaoBanco.getConexao(); 
        int codigoEncontrado = -1;        
        try{        
            stmt = (Statement) con.createStatement();
            resultado = stmt.executeQuery(getSQL(iOpcao, String.valueOf(iCodigoAtual)));        
            resultado.next();
            codigoEncontrado = resultado.getInt("fornecedor_pk");
        }catch(SQLException ex) {
            Logger.getLogger(FornecedorDAO.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog(null, "Erro ao execultar a sql de Pesquisa:\n"+
                    ex.getMessage()+"\n","Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
        }finally{
            try {
                con.close();
                stmt.close();
                resultado.close();
            } catch (SQLException ex) {
                Logger.getLogger(FornecedorDAO.class.getName()).log(Level.SEVERE, null, ex);
                JOptionPane.showMessageDialog(null, "Erro ao encerrar conexão:\n"+
                        ex.getMessage()+"\n","Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
            }            
        }        
        return codigoEncontrado;  
    }

    @Override
    public FornecedorModel getObject(int id) {
        ArrayList<FornecedorModel> listaFornecedores;        
        listaFornecedores = pesquisar(IFornecedor.SQL_CODIGO, String.valueOf(id));
        FornecedorModel fornecedorTemp;
        fornecedorTemp = listaFornecedores.get(0);
        return fornecedorTemp;
    }
    
}
